// 根据官方回答进行整理的内容
package main

import (
	"fmt"
	"sort"
)

func permutation(s string) (ans []string) {
    t := []byte(s) // 转变成切片
    sort.Slice(t, func(i, j int) bool { return t[i] < t[j] })  // 函数排序的依据，排序函数
    n := len(t)
    perm := make([]byte, 0, n)
    vis := make([]bool, n)		// vis 表示这个数字是否被填过
    var backtrack func(int)  // 定义函数变量
    backtrack = func(i int) { // 函数变脸赋值
        if i == n {    // 如果的到了最后一个元素，那么表示达成了一个排序，加入到答案中，然后返回
            ans = append(ans, string(perm))    //
            return
        }
        for j, b := range vis {   // 如果没有到达最后一个元素
            if b || j > 0 && !vis[j-1] && t[j-1] == t[j] { // true 表示这个数被填过了，跳过这个数的填写。情况二：两个连续相同的数，且被填写过; 那么跳过,保证重复字符只会被使用一次。
                continue
            }
            vis[j] = true // true 表示填过了的数;
            perm = append(perm, t[j])
            backtrack(i + 1)
            perm = perm[:len(perm)-1] // 当函数回头了那么表示，当前添加的那个数可以退回了;
            vis[j] = false // 表示这个数没有填过
        }
    }
    backtrack(0)
    return
}

func main() {
	testBool := make([]bool,3)
	fmt.Println(testBool)

}
